package top.zywork.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import top.zywork.common.BeanUtils;
import top.zywork.dto.GoodsSkuAttributeValueDTO;
import top.zywork.dto.PagerDTO;
import top.zywork.query.GoodsSkuAttributeValueQuery;
import top.zywork.service.GoodsSkuAttributeValueService;
import top.zywork.vo.GoodsSkuAttributeValueGroupVO;
import top.zywork.vo.GoodsSkuAttributeValueVO;
import top.zywork.vo.PagerVO;
import top.zywork.vo.ResponseStatusVO;

import java.util.ArrayList;
import java.util.List;

/**
 * GoodsSkuAttributeValueController控制器类<br/>
 *
 * 创建于2019-07-12<br/>
 *
 * @author http://zywork.top 王振宇
 * @version 1.0
 */
@RestController
@RequestMapping("/goods-sku-attr-val")
@Slf4j
public class GoodsSkuAttributeValueController extends BaseController {

    private GoodsSkuAttributeValueService goodsSkuAttributeValueService;

    @GetMapping("admin/multi/{id}")
    public ResponseStatusVO listById(@PathVariable("id") Long id) {
        PagerDTO pagerDTO = goodsSkuAttributeValueService.listById(id);
        PagerVO pagerVO = BeanUtils.copy(pagerDTO, PagerVO.class);
        pagerVO.setRows(BeanUtils.copyList(pagerDTO.getRows(), GoodsSkuAttributeValueVO.class));
        return ResponseStatusVO.ok("查询成功", pagerVO);
    }

    @GetMapping("admin/all")
    public ResponseStatusVO listAll() {
        PagerDTO pagerDTO = goodsSkuAttributeValueService.listAll();
        PagerVO pagerVO = BeanUtils.copy(pagerDTO, PagerVO.class);
        pagerVO.setRows(BeanUtils.copyList(pagerDTO.getRows(), GoodsSkuAttributeValueVO.class));
        return ResponseStatusVO.ok("查询成功", pagerVO);
    }

    @PostMapping("admin/all-cond")
    public ResponseStatusVO listAllByCondition(@RequestBody GoodsSkuAttributeValueQuery goodsSkuAttributeValueQuery) {
        PagerDTO pagerDTO = goodsSkuAttributeValueService.listAllByCondition(goodsSkuAttributeValueQuery);
        PagerVO pagerVO = BeanUtils.copy(pagerDTO, PagerVO.class);
        pagerVO.setRows(BeanUtils.copyList(pagerDTO.getRows(), GoodsSkuAttributeValueVO.class));
        return ResponseStatusVO.ok("查询成功", pagerVO);
    }

    @PostMapping("admin/pager-cond")
    public ResponseStatusVO listPageByCondition(@RequestBody GoodsSkuAttributeValueQuery goodsSkuAttributeValueQuery) {
        PagerDTO pagerDTO = goodsSkuAttributeValueService.listPageByCondition(goodsSkuAttributeValueQuery);
        PagerVO pagerVO = BeanUtils.copy(pagerDTO, PagerVO.class);
        pagerVO.setRows(BeanUtils.copyList(pagerDTO.getRows(), GoodsSkuAttributeValueVO.class));
        return ResponseStatusVO.ok("查询成功", pagerVO);
    }

    /**
     * 根据商品查询条件获取单个商品的所有SKU信息，包含标题，价格，图片，销量等
     * @param goodsSkuAttributeValueQuery
     * @return
     */
    @PostMapping("any/goods-goods-sku-attr")
    public ResponseStatusVO anyGoodsListPageByCondition(@RequestBody GoodsSkuAttributeValueQuery goodsSkuAttributeValueQuery) {
        PagerDTO pagerDTO = goodsSkuAttributeValueService.listAllByCondition(goodsSkuAttributeValueQuery);
        if (pagerDTO.getTotal() > 0) {
            return ResponseStatusVO.ok("成功获取商品信息", convert(pagerDTO.getRows()));
        }
        return ResponseStatusVO.dataError("未获取到商品信息", null);
    }

    /**
     * 根据多个商品sku编号查询指定商品SKU的所有信息，包含标题，价格，图片，销量等
     * @param skuIds
     * @return
     */
    @PostMapping("any/goods-goods-sku-attr/{skuIds}")
    public ResponseStatusVO anyGoodsListPageByCondition(@PathVariable("skuIds") String skuIds) {
        Long[] skuIdArray = top.zywork.common.StringUtils.strToLongArray(skuIds.substring(0, skuIds.length() - 1), ",");
        List<GoodsSkuAttributeValueGroupVO> goodsSkuAttributeValueGroupVOList = new ArrayList<>();
        for (Long skuId : skuIdArray) {
            GoodsSkuAttributeValueQuery goodsSkuAttributeValueQuery = GoodsSkuAttributeValueQuery.builder().goodsSkuId(skuId).build();
            goodsSkuAttributeValueQuery.setSortColumn("goodsSkuId");
            goodsSkuAttributeValueQuery.setSortOrder("asc");
            PagerDTO pagerDTO = goodsSkuAttributeValueService.listAllByCondition(goodsSkuAttributeValueQuery);
            if (pagerDTO.getTotal() > 0) {
                GoodsSkuAttributeValueGroupVO goodsSkuAttributeValueGroupVO = convert(pagerDTO.getRows());
                goodsSkuAttributeValueGroupVOList.add(goodsSkuAttributeValueGroupVO);
            }
        }
        return ResponseStatusVO.ok("成功获取商品信息", goodsSkuAttributeValueGroupVOList);
    }

    private GoodsSkuAttributeValueGroupVO convert(List<Object> goodsSkuAttributeValueList) {
        GoodsSkuAttributeValueGroupVO goodsSkuAttributeValueGroupVO = BeanUtils.copy(goodsSkuAttributeValueList.get(0), GoodsSkuAttributeValueGroupVO.class);
        // 记录当前SKU的id
        Long currentSkuId = 0L;
        // SKU集合
        List<GoodsSkuAttributeValueGroupVO.GoodsSkuVO> goodsSkuVOList = new ArrayList<>();
        // 单个SKU信息
        GoodsSkuAttributeValueGroupVO.GoodsSkuVO goodsSkuVO = null;
        // 单个SKU的属性集合
        List<GoodsSkuAttributeValueGroupVO.GoodsSkuAttrVO> goodsSkuAttrVOList = new ArrayList<>();
        // 对所有 SKU 的所有属性进行循环
        for (Object obj : goodsSkuAttributeValueList) {
            GoodsSkuAttributeValueDTO goodsSkuAttributeValueDTO = (GoodsSkuAttributeValueDTO) obj;
            Long skuId = goodsSkuAttributeValueDTO.getGoodsSkuId();
            if (currentSkuId.longValue() != skuId) {
                // 循环到了新的SKU，设置SKU的基本信息
                goodsSkuVO = GoodsSkuAttributeValueGroupVO.GoodsSkuVO.builder().build();
                BeanUtils.copy(goodsSkuAttributeValueDTO, goodsSkuVO);
                // 保存SKU信息到SKU集合中
                goodsSkuVOList.add(goodsSkuVO);
                // 重新创建用于存储SKU属性的List集合
                goodsSkuAttrVOList = new ArrayList<>();
            }
            // 获取SKU属性信息
            GoodsSkuAttributeValueGroupVO.GoodsSkuAttrVO goodsSkuAttrVO = BeanUtils.copy(goodsSkuAttributeValueDTO, GoodsSkuAttributeValueGroupVO.GoodsSkuAttrVO.class);
            // 将SKU属性信息添加到List集合中
            goodsSkuAttrVOList.add(goodsSkuAttrVO);
            if (goodsSkuVO != null) {
                goodsSkuVO.setGoodsSkuAttrVOList(goodsSkuAttrVOList);
            }
            currentSkuId = skuId;
        }
        goodsSkuAttributeValueGroupVO.setGoodsSkuVOList(goodsSkuVOList);
        return goodsSkuAttributeValueGroupVO;
    }

    @Autowired
    public void setGoodsSkuAttributeValueService(GoodsSkuAttributeValueService goodsSkuAttributeValueService) {
        this.goodsSkuAttributeValueService = goodsSkuAttributeValueService;
    }
}
